home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / paddle / paddle.asm < prev    next >
Assembly Source File  |  1980-01-03  |  7KB  |  261 lines

  1. ;
  2. ; ### Paddle routines by JM v 0.51 ###
  3. ;
  4. ; - Created 900715 by JM -
  5. ;
  6. ;
  7. ; This program reads paddles connected to mouse port #2.
  8. ;
  9. ;
  10. ; Bugs: yet unknown
  11. ;
  12. ;
  13. ; Edited:
  14. ;
  15. ; - 900715 by JM -> v0.01    - Basics from vertb.asm.
  16. ; - 900716 by JM -> v0.02    - Should work but worketh not.
  17. ; - 900717 by JM -> v0.50    - Worketh.  Needed a call to WritePotgo().
  18. ; - 900722 by JM -> v0.51    - Final modifications.  Code made smaller.
  19. ;
  20. ;
  21.  
  22.     include    "bb.i"
  23.     include    "exec/types.i"
  24.     include    "exec/execbase.i"
  25.     include    "exec/tasks.i"
  26.     include    "exec/nodes.i"
  27.     include    "exec/memory.i"
  28.     include    "exec/io.i"
  29.     include    "exec/interrupts.i"
  30.     include    "hardware/intbits.i"
  31.     include    "hardware/custom.i"
  32.     include    "libraries/dos.i"
  33.  
  34.  
  35. OUTRY    equ    1<<15
  36. DATRY    equ    1<<14
  37. OUTRX    equ    1<<13
  38. DATRX    equ    1<<12
  39.  
  40. OUTLY    equ    1<<11
  41. DATLY    equ    1<<10
  42. OUTLX    equ    1<<9
  43. DATLX    equ    1<<8
  44.  
  45. START    equ    1
  46.  
  47.     STRUCTURE mv_VERTB,0    ; oma muuttuja-alue
  48.     APTR    mv_maintask    ; paaohjelman task-osoite
  49.     APTR    mv_potgores    ; resourcen osoite
  50.     ULONG    mv_sigmask    ; signaalimaski
  51.     UWORD    mv_potdata    ; luettu data
  52.     UWORD    mv_firedata    ; nappuloiden tilat
  53.     LABEL    mv_SIZE        ; struktuurin koko
  54.  
  55.     xref    _LVOOldOpenLibrary
  56.     xref    _LVOOpenResource
  57.     xref    _LVOAllocPotBits
  58.     xref    _LVOFreePotBits
  59.     xref    _LVOAllocMem
  60.     xref    _LVOAllocSignal
  61.     xref    _LVOFindTask
  62.     xref    _LVOAddIntServer
  63.     xref    _LVOWait
  64.     xref    _LVORawDoFmt
  65.     xref    _LVOOutput
  66.     xref    _LVOWrite
  67.     xref    _LVORemIntServer
  68.     xref    _LVOFreeSignal
  69.     xref    _LVOFreeMem
  70.     xref    _LVOCloseLibrary
  71.     xref    _LVOSignal
  72.     xref    _LVOWritePotgo
  73.  
  74. .DosBase    equ    -4        ; muuttujat pinossa (offsetit)
  75. .PotgoBase    equ    -8
  76. potbits        equ    -12
  77. VERTB_signal    equ    -13
  78. int_added    equ    -14
  79.  
  80. MEM        set    4        ; tarvittavan muistin määrä
  81. MEMPTR        equ    -20        ; osoitin pinossa
  82. interrupt    equ    -24        ; osoitin pinossa
  83. MEM        set    MEM+(IS_SIZE)    ; lisätään muistin määrään
  84. data        equ    -28        ; osoitin pinossa
  85. MEM        set    MEM+(mv_SIZE)    ; lisätään muistin määrään
  86. buffer        equ    -32        ; osoitin pinossa
  87. MEM        set    MEM+(256)    ; muistin kokonaismäärä
  88.  
  89. main    link    a4,#-32            ; varataan muuttujatila
  90.     movem.l    d0/a4,-(sp)
  91.     moveq    #7,d0
  92. 1$    clr.l    -(a4)            ; nollataan pinossa olevat muuttujat
  93.     dbf    d0,1$
  94.     movem.l    (sp)+,d0/a4
  95.     st    VERTB_signal(a4)    ; lippu: sigbit ei varattu
  96.  
  97.     lea    .DosName(pc),a1        ; dos-kirjaston nimi
  98.     move.l    $4,a6
  99.     jsr    _LVOOldOpenLibrary(a6)    ; mikä tahansa kirjastoversio kelpaa
  100.     move.l    d0,.DosBase(a4)
  101.     beq    cleanup            ; jos ei auennut, pois
  102.  
  103.     lea    .PResName(pc),a1    ; potgo.resourcen nimi
  104.     moveq    #0,d0
  105.     jsr    _LVOOpenResource(a6)    ; avataan potgo.resource
  106.     move.l    d0,.PotgoBase(a4)
  107.     beq    cleanup            ; jos ei auennut, pois
  108.  
  109.     move.l    #OUTRY|DATRY|OUTRX|DATRX|START,d0
  110.     move.l    d0,d2            ; tarvittavat bitit
  111.     move.l    .PotgoBase(a4),a6
  112.     jsr    _LVOAllocPotBits(a6)
  113.     move.l    d0,potbits(a4)        ; varatut bitit
  114.     cmp.l    d0,d2
  115.     bne    cleanup            ; ei saatu kaikkia bittejä
  116.  
  117.     move.l    #MEM,d0            ; varataan muistia
  118.     move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  119.     move.l    $4,a6
  120.     jsr    _LVOAllocMem(a6)
  121.     move.l    d0,MEMPTR(a4)        ; varatun alueen osoite
  122.     beq    cleanup            ; jos nolla, ei saatu muistia
  123.     move.l    d0,a0
  124.     move.l    #MEM,(a0)+        ; varatun alueen pituus
  125.     move.l    a0,interrupt(a4)    ; interrupt-struktuurin osoite
  126.     lea    (IS_SIZE)(a0),a0
  127.     move.l    a0,data(a4)        ; muuttuja-alueen osoite
  128.     lea    (mv_SIZE)(a0),a0
  129.     move.l    a0,buffer(a4)        ; tulostuspuskurin osoite
  130.  
  131.     move.l    data(a4),a2        ; muuttuja-alueen osoite
  132.     moveq    #-1,d0            ; mikä tahansa bitti kelpaa
  133.     jsr    _LVOAllocSignal(a6)    ; varataan signaali
  134.     move.b    d0,VERTB_signal(a4)    ; tallennetaan bitin nro
  135.     moveq    #0,d1
  136.     bset    d0,d1            ; asetetaan sigbit-bitti
  137.     move.l    d1,mv_sigmask(a2)    ; tallennetaan signaalimaski
  138.     move.l    .PotgoBase(a4),mv_potgores(a2)    ; resourcen osoite
  139.     sub.l    a1,a1
  140.     jsr    _LVOFindTask(a6)    ; etsitaan oma task
  141.     move.l    d0,mv_maintask(a2)    ; osoite muuttujatilaan
  142.     move.l    interrupt(a4),a1    ; Interrupt-struktuuri
  143.     move.b    #NT_INTERRUPT,LN_TYPE(a1)    ; noden tyyppi = INTERRUPT
  144.     move.b    #1,LN_PRI(a1)        ; noden prioriteetti = 1
  145.     lea    intr_name(pc),a0    ; noden nimi
  146.     move.l    a0,LN_NAME(a1)        ; nimen osoite struktuuriin
  147.     lea.l    irqcode(pc),a0        ; keskeytysrutiinin osoite
  148.     move.l    a0,IS_CODE(a1)        ; osoite struktuuriin
  149.     move.l    a2,IS_DATA(a1)        ; muuttuja-alueen osoite
  150.     moveq    #INTB_VERTB,d0        ; keskeytyksen tyyppi
  151.     jsr    _LVOAddIntServer(a6)    ; käynnistetään keskeytys
  152.     st    int_added(a4)
  153.  
  154. loop    moveq    #0,d0
  155.     move.b    VERTB_signal(a4),d1    ; odotetaan keskeytyksen
  156.     bset    d1,d0    ; antamaa signaalia
  157.     moveq    #SIGBREAKB_CTRL_C,d1    ; ja CTRL+C:n painamista
  158.     bset    d1,d0
  159.     move.l    $4,a6
  160.     jsr    _LVOWait(a6)        ; ohjelma nukkumaan
  161.     btst    #SIGBREAKB_CTRL_C,d0
  162.     bne    cleanup
  163.     lea    fmtstr(pc),a0        ; format-rivi
  164.     moveq    #0,d0
  165.     moveq    #0,d1
  166.     move.l    data(a4),a2        ; muuttuja-alue
  167.     move.b    mv_potdata(a2),d0    ; paddle
  168.     move.b    mv_potdata+1(a2),d1    ; toinen paddle
  169.     move.w    mv_firedata(a2),-(sp)    ; tulitusnappulat
  170.     move.w    d1,-(sp)        ; luvut pinoon
  171.     move.w    d0,-(sp)
  172.     move.l    sp,a1            ; osoitin lukuihin
  173.     lea.l    putch(pc),a2        ; putchar-rutiinin osoite
  174.     move.l    buffer(a4),a3        ; tulostuspuskuri
  175.     move.l    $4,a6
  176.     jsr    _LVORawDoFmt(a6)    ; formatoidaan tulostus
  177.     addq.l    #6,sp            ; sp takaisin kohdalleen
  178.     move.l    a3,d2
  179.     moveq    #33,d3
  180.     move.l    .DosBase(a4),a6
  181.     jsr    _LVOOutput(a6)        ; tulostustiedosto
  182.     move.l    d0,d1
  183.     beq.s    cleanup            ; nolla -> ei voida tulostaa
  184.     jsr    _LVOWrite(a6)        ; tulostus
  185.     bra    loop
  186.  
  187. putch    move.b    d0,(a3)+        ; putchar-rutiini
  188.     rts
  189.  
  190. cleanup    tst.b    int_added(a4)        ; keskeytysrutiini
  191.     beq.s    ._8            ; toiminnassa?
  192.     move.l    interrupt(a4),a1
  193.     moveq    #INTB_VERTB,d0
  194.     move.l    $4,a6
  195.     jsr    _LVORemIntServer(a6)    ; poistetaan keskeytykset
  196. ._8    moveq    #0,d0
  197.     move.b    VERTB_signal(a4),d0    ; vapautetaan signaalibitti,
  198.     bmi.s    ._9            ; jos se oli varattu
  199.     move.l    $4,a6
  200.     jsr    _LVOFreeSignal(a6)
  201. ._9    move.l    potbits(a4),d0
  202.     beq.s    ._A
  203.     move.l    .PotgoBase(a4),a6
  204.     jsr    _LVOFreePotBits(a6)
  205. ._A    move.l    MEMPTR(a4),d0        ; vapautetaan muisti
  206.     beq.s    ._B
  207.     move.l    d0,a1
  208.     move.l    (a1),d0
  209.     move.l    $4,a6
  210.     jsr    _LVOFreeMem(a6)
  211.     clr.l    MEMPTR(a4)
  212. ._B    move.l    .DosBase(a4),d0        ; suljetaan dos
  213.     beq.s    ._C
  214.     move.l    d0,a1
  215.     move.l    $4,a6
  216.     jsr    _LVOCloseLibrary(a6)
  217.     clr.l    .DosBase(a4)
  218. ._C    moveq    #0,d0            ; virhekoodi = 0
  219.     unlk    a4
  220.     rts
  221.  
  222.  
  223. irqcode    lea    $dff000,a0        ; custom-piirit
  224.     move.w    pot1dat(a0),mv_potdata(a1)    ; luetaan paddle
  225.     move.w    joy1dat(a0),d0        ; painikkeet
  226.     move.w    d0,d1
  227.     lsr.w    #1,d1
  228.     and.w    #$0101,d1        ; muut bitit pois
  229.     eor.w    d1,d0
  230.     move.w    d0,d1
  231.     and.w    #$0003,d0        ; taas liiat pois
  232.     and.w    #$0300,d1        ; tästä myös
  233.     lsr.w    #6,d1            ; molemmat tavut samaan
  234.     or.b    d1,d0
  235.     move.w    d0,mv_firedata(a1)    ; nappuloiden tilat
  236.     move.l    mv_potgores(a1),a5    ; potgo base talteen
  237.     move.l    mv_sigmask(a1),d0    ; signaalimaski
  238.     move.l    mv_maintask(a1),a1    ; taski
  239.     move.l    $4,a6
  240.     jsr    _LVOSignal(a6)        ; annetaan signaali
  241.     move.l    a5,a6            ; potgo base
  242.     moveq    #1,d0
  243.     moveq    #1,d1            ; käynnistetään uusi muunnos
  244.     jsr    _LVOWritePotgo(a6)
  245.     moveq    #0,d0            ; tieto Execille, että
  246.     rts                ; keskeytysketju voi jatkua
  247.  
  248.  
  249. intr_name:
  250.     dc.b    'My_Paddle_Intr',0    ; keskeytyksen nimi
  251. .DosName:
  252.     dc.b    'dos.library',0
  253. .PResName:
  254.     dc.b    'potgo.resource',0
  255. fmtstr    dc.b    ' Paddle value: %3.3d %3.3d  Fire: %02.2x',13,0
  256.     ds.w    0
  257.  
  258.     end
  259.  
  260.  
  261.